package service

import (
	"net/http"

	"task/utils"

	"github.com/gin-gonic/gin"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

// NewServer new server.
func NewServer() *gin.Engine {
	// 创建gin服务
	server := gin.New()
	server.LoadHTMLGlob("templates/*.tmpl")
	// 设置生产环境
	gin.SetMode(gin.ReleaseMode)
	// 使用中间件 引入监控
	server.Use(gin.Recovery(), metricsMiddlewares())
	// 定义路由
	// metrics
	server.GET("/metrics", func(c *gin.Context) {
		h := promhttp.Handler()
		h.ServeHTTP(c.Writer, c.Request)
	})
	// ping
	server.GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	// index
	server.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.tmpl", gin.H{
			"title": "Task",
		})
	})
	// todo dag
	server.GET("/dags", func(c *gin.Context) {
		ListDag(c)
	})
	server.GET("/dag", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	server.POST("/dag", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	server.PUT("/dag", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	server.DELETE("/dag", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	// todo processor
	server.GET("/processors", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	server.GET("/processor", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	server.POST("/processor", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	server.PUT("/processor", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	server.DELETE("/processor", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	// resource
	server.POST("/resource", func(c *gin.Context) {
		result, err := addResource(c)
		utils.HttpResponse(c, result, err)
	})
	// todo resource state
	server.GET("/resource/state", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	return server
}
